본 게시글의 원문은 Yann Debray의 MATLAB with Python Book 입니다. 해당 책은 MIT 라이센스를 따르기 때문에 개인적으로 번역하여 재배포 합니다. 본 포스팅에는 추후 유료 수익을 위한 광고가 부착될 수도 있습니다.

MIT License

Copyright (c) 2023 Yann Debray

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

본 게시물에서 활용된 소스 코드들은 모두 Yann Debray의 GitHub Repo에서 확인할 수 있습니다.

7.2. 텐서플로우와 파이토치 모델 통합을 통한 시뮬레이션 및 코드 생성

두 번째 시나리오에서는 텐서플로우 또는 파이토치로 개발된 AI 딥러닝 모델이 전체 시스템과 함께 시뮬레이션될 뿐만 아니라, 임베디드 시스템에 통합하기 위해 AI 모델의 코드가 생성되어야 합니다.

이 워크플로우의 한 예는 MATLAB UK Expo 2023에서 MBDA에 의해 발표되었습니다.

본격적으로 시작하기 전에, 코드 생성이 필수인 경우 파이썬 AI 모델을 Simulink에 통합하는 두 가지 옵션이 있습니다. 첫 번째는 딥러닝 툴박스를 사용하여 MATLAB에서 직접 딥러닝 모델을 가져오는 것입니다. 두 번째는 TensorFlow Lite를 사용하여 시뮬레이션하고 코드를 생성하는 것입니다. 이 두 가지 접근 방식의 장단점은 다음과 같습니다: 이들은 라이브러리 없는 C 및 C++ 코드, 인텔 및 ARM 프로세서를 위한 최적화된 코드, 그리고 GPU를 위한 CUDA 코드입니다. 단점은 경우에 따라 입력 프로세스가 번거로울 수 있으며, 맞춤 코드와 수동 검증 테스트가 필요하다는 점입니다.

  • MATLAB에서 딥러닝 모델 직접 가져오기

    (+) 멀티 플랫폼 코드 생성: 라이브러리 없는 C/C++ 코드, 인텔 및 ARM 프로세서를 위한 최적화된 코드, NVIDIA® GPU를 위한 CUDA 코드

    (∆) 가져오기 프로세스가 번거로울 수 있으며, 맞춤 코드와 검증 테스트가 필요함

  • TensorFlow Lite (TFLite)에서 딥러닝 모델 통합

    (+) 모델을 컴파일하기 위해 간단한 파이썬 코드만 필요

    (∆) 현재 윈도우와 리눅스 대상 하드웨어에 제한된 TensorFlow Lite 인터프리터와 라이브러리가 필요

7.2.1. MATLAB에서 딥러닝 모델 직접 가져오기

TensorFlow, PyTorch, ONNX 모델을 MATLAB으로 변환할 수 있습니다. 모델이 MATLAB으로 변환되면, 딥 뉴럴 네트워크 블록을 사용하여 Simulink에서 시뮬레이션과 코드 생성을 모두 수행할 수 있습니다.

TensorFlow 모델을 사용하여 배터리의 충전 상태를 예측하고, 배터리 관리 시스템에 통합될 C 코드를 생성해 봅시다.

딥 네트워크 디자이너를 사용하여 가져온 네트워크의 모양을 시각화할 수 있습니다.

그런 다음 가져온 모델을 .mat 파일로 저장하고 Simulink 블록에 로드합니다.

Python AI 모델을 Simulink에 통합하는 또 다른 사용 사례는 제어 시스템 또는 물리적 시스템을 이 시스템의 축소 모델로 대체하는 것입니다.

7.2.2. TensorFlow Lite (TFLite)에서 딥러닝 모델 통합

TensorFlow 사용자가 AI를 Simulink에 통합하려는 경우, TensorFlow Lite를 사용하는 대안 접근 방식이 있습니다. 우리는 MATLAB 함수를 통해 통합된 TFLite 객체 탐지기를 예로 들어 설명하겠습니다. 이 모델의 동등한 코드를 생성할 때, TFLite 런타임으로 코드를 랩핑합니다.

네 번째 시나리오에서는 Simulink 모델을 파이썬 기반의 생산 시스템에 배포하는 것이 목표입니다.

여기서 단계는 동일합니다. 차이점은 모델을 배포용으로 구성해야 한다는 것입니다. 모든 Simulink 모델이 배포 가능한 것은 아니기 때문입니다. 따라서 시뮬레이션 입력 개체를 호출하기 전에 다음 줄을 추가해야 합니다:

si = simulink.compiler.configureForDeployment(si);

그런 다음 MATLAB 함수를 파이썬 패키지로 컴파일해야 합니다:

appFile = which('sim_the_model2');
outDir = fullfile(origDir,'sim_the_model2_python_package_installer');
compiler.build.pythonPackage(appFile, ...
        'PackageName','sim_the_model2', ...
        'OutputDir',outDir);

마지막으로, 파이썬 패키지를 설치하고 다음과 같이 호출해야 합니다:

import sim_the_model2
import matplotlib.pyplot as plt

# sim_the_model 패키지 초기화
mlr = sim_the_model2.initialize()

# 두 번의 sim_the_model 호출 결과를 저장할 res 리스트 할당
res = [0]*2
# 첫 번째 시뮬레이션: 기본 매개변수 값 사용: Mb = 1200 Kg
res[0] = mlr.sim_the_model2('StopTime', 30)

# 두 번째 시뮬레이션: 조정 가능한 매개변수의 새 값 사용
tunableParams = {
    'Mb': 5000.0   # 몸체 질량 Kg에 대한 새 매개변수 사용
}
res[1] = mlr.sim_the_model2('StopTime', 30, 'TunableParameters', tunableParams)


# 결과를 플로팅
cols = plt.rcParams['axes.prop_cycle'].by_key()['color']
fig, ax = plt.subplots(1, 1, sharex=True)
ax.plot(res[0]['vertical_disp']['Time'], res[0]['vertical_disp']['Data'], color=cols[0],
        label="수직 변위: 기본 몸체 질량 Mb로 첫 번째 시뮬레이션")
ax.plot(res[1]['vertical_disp']['Time'], res[1]['vertical_disp']['Data'],
        color=cols[1], label="수직 변위: 업데이트된 몸체 질량 Mb로 두 번째 시뮬레이션")


ax.grid()
lg = ax.legend(fontsize='x-small')
lg.set_draggable(True)
ax.set_title("MATLAB 런타임을 사용한 sim_the_model 결과")
plt.show()

mlr.terminate()  # MATLAB 런타임 종료

이 코드는 다음과 같은 파이썬 플롯을 생성합니다: